#COMPILE EXE "Folder Icon Autoset.exe" #DIM ALL $VER = "1.0" $Label2 = " folder(s) + subfolder(s) detected." $Label3 = " icon(s) ready to use for customization." $Label4 = " icon(s) already assigned to a folder (no action needed)." $Label5 = " folder(s) in conflict - customized with a different icon." $pvFile = "fia_preview.txt" '------------------------------------------------------------------------------ ' ** Resources ** '------------------------------------------------------------------------------ #RESOURCE MANIFEST 1, "XPTheme.xml" #RESOURCE ICON, A, "icon.ico" #RESOURCE VERSIONINFO #RESOURCE FILEVERSION 1,0,0,0 #RESOURCE STRINGINFO "0409", "0000" #RESOURCE VERSION$ "CompanyName", "mougino software" #RESOURCE VERSION$ "LegalCopyright", "(c) 2019 mougino" #RESOURCE VERSION$ "ProductName", "Folder Icon Autoset" #RESOURCE VERSION$ "ProductVersion", "1.0" #RESOURCE VERSION$ "FileDescription", "http://mougino.free.fr" '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Includes ** '------------------------------------------------------------------------------ #INCLUDE ONCE "WIN32API.INC" '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Globals ** '------------------------------------------------------------------------------ GLOBAL hDlg AS DWORD GLOBAL rootPath AS STRING GLOBAL icoSrc() AS STRING GLOBAL icoTgt() AS STRING GLOBAL icoIso() AS STRING GLOBAL recursLvl AS LONG GLOBAL nFolder AS LONG GLOBAL nUsable AS LONG GLOBAL nConflict AS LONG GLOBAL nNochange AS LONG GLOBAL nDoneA AS LONG GLOBAL nDoneU AS LONG '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Constants ** '------------------------------------------------------------------------------ %ID_TIMER = %WM_USER + 400 %IDC_TEXTBOX1 = 1001 %IDC_BUTTON0 = 1002 %IDC_BUTTON2 = 1003 %IDC_BUTTON3 = 1004 %IDC_BUTTON4 = 1005 %IDC_FRAME1 = 1006 %IDC_LABEL2 = 1007 %IDC_LABEL3 = 1008 %IDC_LABEL4 = 1009 %IDC_LABEL5 = 1010 %IDC_LABEL1 = 1011 %IDC_COMBOBOX1 = 1012 '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Functions ** '------------------------------------------------------------------------------ FUNCTION PBMAIN() ShowMain %HWND_DESKTOP END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION GetAssignedIcon(folder AS STRING) AS STRING LOCAL a AS ASCIIZ * %MAX_PATH LOCAL s AS STRING GetPrivateProfileString ".ShellClassInfo", "IconResource", "", a, _ %MAX_PATH, RTRIM$(folder, "\") + "\desktop.ini" s = TRIM$(a) IF INSTR(s, $DQ) > 0 THEN s = TRIM$(s, $DQ) IF RIGHT$(s, 2) = ",0" THEN s = LEFT$(s, -2) FUNCTION = s END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION AssignedIconDetail(folder AS STRING) AS STRING LOCAL ico AS STRING LOCAL ff, icoSiz AS LONG ico = GetAssignedIcon(folder) REPLACE ".\" WITH RTRIM$(folder, "\") + "\" IN ico IF ISFILE(ico) THEN ff = FREEFILE OPEN ico FOR BINARY ACCESS READ LOCK SHARED AS #ff icoSiz = LOF(#ff) CLOSE #ff FUNCTION = ico + "|" + TRIM$(icoSiz) END IF END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION GetFirstIcon(folder AS STRING) AS STRING LOCAL s AS STRING s = DIR$(RTRIM$(folder, "\") + "\*.ico") DIR$ CLOSE FUNCTION = s END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ FUNCTION FirstIconDetail(folder AS STRING) AS STRING LOCAL ico AS STRING LOCAL ff, icoSiz AS LONG ico = RTRIM$(folder, "\") + "\" + GetFirstIcon(folder) IF ISFILE(ico) THEN ff = FREEFILE OPEN ico FOR BINARY ACCESS READ LOCK SHARED AS #ff icoSiz = LOF(#ff) CLOSE #ff FUNCTION = ico + "|" + TRIM$(icoSiz) END IF END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB AnalyzeThis(folder AS STRING) LOCAL e, folder() AS STRING LOCAL ico0, ico1 AS STRING LOCAL n AS LONG ' Folder beyond recursive level? -> if yes give up IF TALLY(folder, "\") > recursLvl + 1 THEN EXIT SUB INCR nFolder ' else increase number of detected folders ' Analyze current folder icons ico0 = AssignedIconDetail(folder) ico1 = FirstIconDetail(folder) IF ico1 <> "" AND ico0 <> ico1 THEN ' new or different icon available IF ISFALSE ARRAYATTR(icoSrc(), 0) THEN ' array not yet dimensioned DIM icoSrc(0) : icoSrc(0) = ico0 DIM icoTgt(0) : icoTgt(0) = ico1 ELSE n = UBOUND(icoSrc) + 1 REDIM PRESERVE icoSrc(n) : icoSrc(n) = ico0 REDIM PRESERVE icoTgt(n) : icoTgt(n) = ico1 END IF INCR nUsable ' increase number of usable icon IF ico0 <> "" THEN INCR nConflict ELSEIF ico1 <> "" AND ico0 = ico1 THEN ' icon already assigned IF ISFALSE ARRAYATTR(icoIso(), 0) THEN ' array not yet dimensioned DIM icoIso(0) icoIso(0) = ico0 ELSE n = UBOUND(icoIso) + 1 REDIM PRESERVE icoIso(n) icoIso(n) = ico0 END IF INCR nNochange END IF ' List subfolders ... e = DIR$(folder, ONLY %SUBDIR) IF e = "" THEN DIR$ CLOSE : EXIT SUB ' no subfolder DIM folder(0) : folder(0) = RTRIM$(folder, "\") + "\" + e + "\" DO e = DIR$(NEXT) IF e <> "" THEN n = UBOUND(folder) + 1 REDIM PRESERVE folder(n) folder(n) = RTRIM$(folder, "\") + "\" + e + "\" END IF LOOP UNTIL e = "" DIR$ CLOSE ' ... and AnalyzeTh[em] recursively FOR n = 0 TO UBOUND(folder) AnalyzeThis folder(n) NEXT END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ THREAD FUNCTION Analyze(BYVAL param AS LONG) AS LONG KILL EXE.PATH$ + $pvFile AnalyzeThis rootPath FUNCTION = 1 END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ MACRO NOTHING_TO_DO MessageBox hDlg, "No icon detected in any folder."+$CR+$CR _ +"No customization possible.",EXE.NAME$,%MB_ICONINFORMATION EXIT SUB END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB PreviewChanges() LOCAL i, j, ff AS LONG LOCAL ico0, ico1, folder AS STRING IF nUsable + nNochange = 0 THEN NOTHING_TO_DO END IF ff = FREEFILE OPEN EXE.PATH$ + $pvFile FOR OUTPUT AS #ff PRINT #ff, STRING$(80, "#") PRINT #ff, "## FOLDER ICON AUTOSET" PRINT #ff, "## Analyzing " + $DQ + rootPath + $DQ PRINT #ff, "## " + RIGHT$(DATE$,4) + "-" + LEFT$(DATE$,2) + MID$(DATE$,3,3) + " at " + TIME$ PRINT #ff, STRING$(80, "#") PRINT #ff, "" IF nConflict <> 0 THEN PRINT #ff, STRING$(80, "#") PRINT #ff, "## Folders in conflict (a different icon is already assigned)" PRINT #ff, STRING$(80, "#") PRINT #ff, "" PRINT #ff, STRING$(65, ">") PRINT #ff, ">> Remove the folders that you do NOT want to customize:" PRINT #ff, ">> (do not forget to save your changes to this file)" PRINT #ff, STRING$(65, ">") PRINT #ff, "" FOR i = 0 TO UBOUND(icoSrc) IF icoSrc(i) <> "" THEN ico0 = REMOVE$(icoSrc(i), rootPath) + " bytes)" REPLACE "|" WITH $DQ + " (" IN ico0 j = INSTR(-1, ico0, "\") folder = LEFT$(ico0, j) IF folder = "" THEN folder = "\" ico0 = $DQ + MID$(ico0, j+1) ico1 = REMOVE$(icoTgt(i), rootPath) + " bytes)" REPLACE "|" WITH $DQ + " (" IN ico1 ico1 = $DQ + MID$(ico1, j+1) PRINT #ff, "- " + $DQ + folder + $DQ + " :" PRINT #ff, " Currently customized with " + ico0 PRINT #ff, " Will be replaced with " + ico1 PRINT #ff, "" END IF NEXT END IF IF nUsable <> nConflict THEN PRINT #ff, STRING$(80, "#") PRINT #ff, "## Folders ready to be customized (new icon has been detected)" PRINT #ff, STRING$(80, "#") PRINT #ff, "" PRINT #ff, STRING$(65, ">") PRINT #ff, ">> Remove the folders that you do NOT want to customize:" PRINT #ff, ">> (do not forget to save your changes to this file)" PRINT #ff, STRING$(65, ">") PRINT #ff, "" FOR i = 0 TO UBOUND(icoSrc) IF icoSrc(i) = "" THEN ico1 = REMOVE$(icoTgt(i), rootPath) + " bytes)" REPLACE "|" WITH $DQ + " (" IN ico1 j = INSTR(-1, ico1, "\") folder = LEFT$(ico1, j) IF folder = "" THEN folder = "\" ico1 = $DQ + MID$(ico1, j+1) PRINT #ff, "- " + $DQ + folder + $DQ + " :" PRINT #ff, " Ready to be customized with " + ico1 PRINT #ff, "" END IF NEXT END IF IF nNochange <> 0 THEN PRINT #ff, STRING$(80, "#") PRINT #ff, "## Folders already customized" PRINT #ff, STRING$(80, "#") PRINT #ff, "" PRINT #ff, STRING$(65, ">") PRINT #ff, ">> You can move these folders to the next 'UNASSIGN' section:" PRINT #ff, ">> This will clear their icon customization..." PRINT #ff, ">> (do not forget to save your changes to this file)" PRINT #ff, STRING$(65, ">") PRINT #ff, "" FOR i = 0 TO UBOUND(icoIso) ico0 = REMOVE$(icoIso(i), rootPath) + " bytes)" REPLACE "|" WITH $DQ + " (" IN ico0 j = INSTR(-1, ico0, "\") folder = LEFT$(ico0, j) IF folder = "" THEN folder = "\" ico0 = $DQ + MID$(ico0, j+1) PRINT #ff, "- " + $DQ + folder + $DQ + " :" PRINT #ff, " Already customized with " + ico0 PRINT #ff, "" NEXT PRINT #ff, STRING$(80, "#") PRINT #ff, "## UNASSIGN - Clear folder icon customization" PRINT #ff, STRING$(80, "#") PRINT #ff, "" PRINT #ff, STRING$(65, ">") PRINT #ff, ">> Cut+Paste the folders from the previous section here:" PRINT #ff, ">> This will clear their icon customization..." PRINT #ff, ">> (do not forget to save your changes to this file)" PRINT #ff, STRING$(65, ">") PRINT #ff, "" END IF CLOSE #ff ShellExecute 0, "open", EXE.PATH$ + $pvFile + $NUL, $NUL, BYVAL 0&, %SW_SHOWNORMAL END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB CreateDesktopIni(folder AS STRING) WritePrivateProfileString ".ShellClassInfo", "InfoTip", _ "Customized by Folder Icon Autoset (web:mougino.free.fr)", _ RTRIM$(folder, "\") + "\desktop.ini" SetFileAttributes RTRIM$(folder, "\") + "\desktop.ini", _ %FILE_ATTRIBUTE_SYSTEM + %FILE_ATTRIBUTE_HIDDEN END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB AutosetIcons() LOCAL i, j, tuned, unassign AS LONG LOCAL pview, ico, folder AS STRING nDoneA = 0 IF nUsable + nNochange = 0 THEN NOTHING_TO_DO END IF ' Did user activate the preview/tune option? IF ISFILE(EXE.PATH$ + $pvFile) THEN i = FREEFILE OPEN EXE.PATH$ + $pvFile FOR BINARY ACCESS READ LOCK SHARED AS #i GET$ #i, LOF(#i), pview CLOSE #i tuned = 1 END IF ' Handle new icons and replacement icons FOR i = 0 TO UBOUND(icoTgt) ico = icoTgt(i) j = INSTR(ico, "|") ico = LEFT$(ico, j - 1) j = INSTR(-1, ico, "\") folder = LEFT$(ico, j) IF folder = rootPath THEN folder += "\" ico = MID$(ico, j + 1) IF ISTRUE tuned THEN ' folder customization removed by user? IF 0 = INSTR(pview, $DQ + REMOVE$(folder, rootPath) + $DQ) THEN ITERATE FOR END IF IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1) IF NOT ISFILE(folder + "desktop.ini") THEN CreateDesktopIni(folder) WritePrivateProfileString ".ShellClassInfo", "IconResource", _ ".\" + ico + ",0" , folder + "desktop.ini" INCR nDoneA NEXT ' Handle icon unassignments IF ISFALSE tuned THEN EXIT SUB ' only in preview/tune mode unassign = INSTR(pview, "## UNASSIGN - ") IF unassign = 0 THEN EXIT SUB ' in case user removed the section FOR i = 0 TO UBOUND(icoIso) ico = icoIso(i) j = INSTR(ico, "|") ico = LEFT$(ico, j-1) j = INSTR(-1, ico, "\") folder = LEFT$(ico, j) IF folder = rootPath THEN folder += "\" IF INSTR(pview, $DQ + REMOVE$(folder, rootPath) + $DQ) > unassign THEN IF RIGHT$(folder, 2) = "\\" THEN folder = LEFT$(folder, -1) SetFileAttributes folder + "desktop.ini", %FILE_ATTRIBUTE_NORMAL KILL folder + "desktop.ini" INCR nDoneU END IF NEXT END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ SUB ExplorerRefresh() SHELL "ie4uinit.exe -ClearIconCache" SHELL "ie4uinit.exe -show" END SUB '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ MACRO REFRESH_LABELS CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, TRIM$(nFolder) + $Label2 ' X detected CONTROL SET TEXT CB.HNDL, %IDC_LABEL3, TRIM$(nUsable) + $Label3 ' X ready for use CONTROL SET TEXT CB.HNDL, %IDC_LABEL4, TRIM$(nNochange) + $Label4 ' X already assigned CONTROL SET TEXT CB.HNDL, %IDC_LABEL5, TRIM$(nConflict) + $Label5 ' X in conflict END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ MACRO RESET_SCAN_DATA ERASE icoSrc(), icoTgt(), icoIso() nFolder = 0 nUsable = 0 nConflict = 0 nNochange = 0 nDoneA = 0 nDoneU = 0 END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ MACRO RESET_UI CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, $SPC + rootPath CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "SCAN !" CONTROL DISABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE CONTROL DISABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS CONTROL ENABLE CB.HNDL, %IDC_BUTTON0 ' [...] CONTROL ENABLE CB.HNDL, %IDC_COMBOBOX1 RESET_SCAN_DATA REFRESH_LABELS END MACRO '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** CallBacks ** '------------------------------------------------------------------------------ CALLBACK FUNCTION ProcMain() STATIC hThread AS DWORD LOCAL lRes, idEvent AS LONG LOCAL e AS STRING SELECT CASE AS LONG CB.MSG CASE %WM_INITDIALOG ' Initialization handler rootPath = EXE.PATH$ RESET_UI ' CallBack Message is a Timer event CASE %WM_TIMER REFRESH_LABELS THREAD STATUS hThread TO lRes IF lRes <> 0 AND lRes <> &H103 THEN ' Thread finished IF idEvent THEN KillTimer CB.HNDL, idEvent THREAD CLOSE hThread TO lRes hThread = 0 CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "SCAN !" CONTROL ENABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE CONTROL ENABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS CONTROL ENABLE CB.HNDL, %IDC_BUTTON0 ' [...] CONTROL ENABLE CB.HNDL, %IDC_COMBOBOX1 END IF CASE %WM_COMMAND ' Process control notifications SELECT CASE AS LONG CB.CTL CASE %IDC_BUTTON0 ' [...] IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN DISPLAY BROWSE CB.HNDL, 40, -10, "Folder Icon Autoset" _ + $CR + "Pick a folder for analysis :", "", _ %BIF_RETURNONLYFSDIRS + %BIF_NONEWFOLDERBUTTON TO e IF e <> "" THEN rootPath = RTRIM$(e, "\") + "\" RESET_UI END IF END IF CASE %IDC_BUTTON2 ' SCAN ! / STOP SCAN IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN CONTROL GET TEXT CB.HNDL, %IDC_BUTTON2 TO e IF e = "SCAN !" THEN COMBOBOX GET SELECT CB.HNDL, %IDC_COMBOBOX1 TO recursLvl IF recursLvl = 1 THEN recursLvl = 999999 ELSE DECR recursLvl CONTROL DISABLE CB.HNDL, %IDC_BUTTON0 ' [...] CONTROL DISABLE CB.HNDL, %IDC_COMBOBOX1 CONTROL DISABLE CB.HNDL, %IDC_BUTTON3 ' PREVIEW / TUNE CONTROL DISABLE CB.HNDL, %IDC_BUTTON4 ' AUTOSET ICONS CONTROL SET TEXT CB.HNDL, %IDC_BUTTON2, "STOP SCAN" ' Start scanning thread RESET_SCAN_DATA THREAD CREATE Analyze(0) TO hThread ' Start timer to refresh labels idEvent = SetTimer(CB.HNDL, %ID_TIMER, 500, BYVAL 0&) DIALOG POST CB.HNDL, %WM_TIMER, %ID_TIMER, 0 ELSE ' STOP SCAN ' Kill timer to refresh labels IF idEvent THEN KillTimer CB.HNDL, idEvent ' Kill scanning thread IF hThread THEN THREAD SUSPEND hThread TO lRes THREAD CLOSE hThread TO lRes hThread = 0 END IF RESET_UI END IF END IF CASE %IDC_BUTTON3 ' PREVIEW / TUNE IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN PreviewChanges() END IF CASE %IDC_BUTTON4 ' AUTOSET ICONS IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN AutosetIcons() ExplorerRefresh() e = TRIM$(nDoneA)+" folder(s) successfully customized !" IF nDoneU > 0 THEN e += $CR+$CR+TRIM$(nDoneU)+" folder(s) correctly unassigned !" END IF MessageBox CB.HNDL,(e),EXE.NAME$,%MB_ICONINFORMATION END IF END SELECT END SELECT END FUNCTION '------------------------------------------------------------------------------ '------------------------------------------------------------------------------ ' ** Dialogs ** '------------------------------------------------------------------------------ FUNCTION ShowMain(BYVAL hParent AS DWORD) AS LONG LOCAL lRes AS LONG DIALOG NEW PIXELS, hParent, "Folder Icon Autoset "+$VER, , , 416, 256, %WS_POPUP _ OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_CLIPSIBLINGS OR _ %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR %DS_NOFAILCREATE OR _ %DS_SETFONT OR %WS_CAPTION OR %WS_MINIMIZEBOX, %WS_EX_WINDOWEDGE OR _ %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _ %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SET ICON hDlg, "A" CONTROL ADD LABEL, hDlg, %IDC_TEXTBOX1, EXE.PATH$, 8, 8, 360, 18, _ %WS_CHILD OR %WS_VISIBLE OR %WS_BORDER OR %SS_LEFT, %WS_EX_LEFT OR _ %WS_EX_LTRREADING CONTROL SET COLOR hDlg, %IDC_TEXTBOX1, -1, %WHITE CONTROL ADD BUTTON, hDlg, %IDC_BUTTON0, "...", 368, 7, 32, 20 CONTROL ADD LABEL, hDlg, %IDC_LABEL1, "Stop analysis at this folder " + _ "recursion level : (0 = infinite)", 8, 34, 256, 16 CONTROL ADD COMBOBOX, hDlg, %IDC_COMBOBOX1, , 272, 32, 30, 24, %WS_CHILD _ OR %WS_VISIBLE OR %WS_TABSTOP OR %CBS_DROPDOWNLIST, %WS_EX_LEFT OR _ %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR FOR lRes = 0 TO 9 COMBOBOX ADD hDlg, %IDC_COMBOBOX1, TRIM$(lRes) NEXT COMBOBOX SELECT hDlg, %IDC_COMBOBOX1, 1 CONTROL ADD FRAME, hDlg, %IDC_FRAME1, "Scan results", 8, 64, 400, 136 CONTROL ADD LABEL, hDlg, %IDC_LABEL2, TRIM$(0) + $Label2, 24, 95, 368, 24 CONTROL SET COLOR hDlg, %IDC_LABEL2, %BLUE, -1 CONTROL ADD LABEL, hDlg, %IDC_LABEL3, TRIM$(0) + $Label3, 24, 120, 368, 24 CONTROL SET COLOR hDlg, %IDC_LABEL3, RGB(0, 128, 0), -1 CONTROL ADD LABEL, hDlg, %IDC_LABEL4, TRIM$(0) + $Label4, 24, 145, 368, 24 CONTROL SET COLOR hDlg, %IDC_LABEL4, RGB(40, 40, 40), -1 CONTROL ADD LABEL, hDlg, %IDC_LABEL5, TRIM$(0) + $Label5, 24, 170, 368, 24 CONTROL SET COLOR hDlg, %IDC_LABEL5, RGB(128, 0, 0), -1 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON2, "SCAN !", 8, 208, 128, 40 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON3, "PREVIEW / TUNE", 144, 208, 128, 40 CONTROL ADD BUTTON, hDlg, %IDC_BUTTON4, "AUTOSET ICONS", 280, 208, 128, 40 DIALOG SHOW MODAL hDlg, CALL ProcMain TO lRes FUNCTION = lRes END FUNCTION '------------------------------------------------------------------------------